package com.hospital.hms.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONException;
import cn.hutool.json.JSONUtil;
import com.hospital.hms.exception.GlobalException;
import com.hospital.hms.utils.PageUtils;
import com.hospital.hms.dao.mapper.DoctorDao;
import com.hospital.hms.dao.mapper.MedicalDeptSubDoctorDao;
import com.hospital.hms.pojo.Doctor;
import com.hospital.hms.pojo.MedicalDeptSubDoctor;
import com.hospital.hms.service.DoctorService;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.util.*;
@Slf4j
@Service
public class DoctorServiceImpl implements DoctorService {
    @Autowired
    private DoctorDao doctorDao;
    @Autowired
    private MedicalDeptSubDoctorDao medicalDeptSubDoctorDao;
    @Value("${minio.endpoint}")
    private String endpoint;

    @Value("${minio.access-key}")
    private String accessKey;

    @Value("${minio.secret-key}")
    private String secretKey;

    @Value("${minio.bucket-name}")
    private String bucketName;
    private static final String DOCTOR_FILE_PREFIX = "doctor-";  // 文件名前缀
    private static final String FILE_EXTENSION = ".jpg";  // 文件扩展名
    private static final int MAX_FILE_SIZE = 5 * 1024 * 1024;  // 最大文件上传大小，5MB
    @Override
    @Transactional
    public void updatePicture(MultipartFile file, Integer doctorId) {
        try {
            //组织文件名称
            String filename = DOCTOR_FILE_PREFIX + doctorId + FILE_EXTENSION;

            // 使用构建器模式初始化 MinioClient，连接到Minio服务器
            MinioClient minioClient = MinioClient.builder()
                    .endpoint(endpoint)  // Minio服务器地址
                    .credentials(accessKey, secretKey)  // Minio认证的accessKey和secretKey
                    .build();

            // 上传文件到Minio服务器
            /*
             * -1：表示流的大小不确定或不需要提前指定。MinioClient 会通过流的结束来自动判断文件的大小。
             * 它在处理不确定大小的文件时非常有用，尤其是当你没有提前知道文件的大小时。
             * */
            minioClient.putObject(
                    PutObjectArgs.builder()
                            .bucket(bucketName)  // 指定存储桶的名称
                            .object("doctor/" + filename)  // 设置存储路径和文件名
                            .stream(file.getInputStream(), -1, MAX_FILE_SIZE)  // 设置上传流、文件长度和最大文件大小，-1
                            .contentType("image/jpeg")  // 设置文件类型为JPEG图片
                            .build()
            );

            // 封装更新图片地址的参数，并更新数据库
            HashMap<String, Object> updateParams = new HashMap<>();
            updateParams.put("id", doctorId);  // 设置医生ID
            updateParams.put("photo", "/doctor/" + filename);  // 设置图片路径
            // 更新数据库中的图片路径信息
            doctorDao.updatePicture(updateParams);
        }catch (Exception e) {
            log.error("照片更新失败",e);
            throw new GlobalException("照片更新失败");
        }
    }


    @Override
    public PageUtils selectConditionByPage(Map map) {
        long count = doctorDao.selectConditionByPageCount(map);
        if (count==0){
            return new PageUtils(Collections.emptyList(),count, MapUtil.getInt(map,"page"),
                    MapUtil.getInt(map,"length"));
        }else {
            ArrayList<HashMap<String, Object>> list = doctorDao.selectConditionByPage(map);
            return new PageUtils(list,count,MapUtil.
                    getInt(map,"page"),MapUtil.getInt(map,"length"));

        }

    }

    @Override
    public HashMap<String, Object> selectDoctorDetailById(int id) {
        HashMap<String, Object> hashMap = doctorDao.selectDoctorDetailById(id);
        /**
         * 字符串转换为JSON数组
         * 原始 tag -> ["领域专家","温暖贴心","人很好"]
         * 转换后：tag -> {JSONArray@13033}  size = 3
         *
         * 原始数据：
         * String tag = "[\"领域专家\", \"温暖贴心\", \"人很好\"]";
         *
         * 转换后的数据：
         * JSONArray tagArray = JSONUtil.parseArray("[\"领域专家\", \"温暖贴心\", \"人很好\"]");
         * System.out.println(tagArray.get(0)); // 输出 "领域专家"
         * */
        hashMap.replace("tag", JSONUtil.parseArray(MapUtil.getStr(hashMap,"tag")));
        return hashMap;
    }

    @Override
    @Transactional
    public void insert(Map map) {
        Doctor doctor = BeanUtil.toBean(map, Doctor.class);
        doctorDao.insert(doctor);
        Integer doctorid = doctor.getId();
        Integer subId = MapUtil.getInt(map, "subId");
        MedicalDeptSubDoctor medicalDeptSubDoctor = new MedicalDeptSubDoctor();
        medicalDeptSubDoctor.setDoctorId(doctorid);
        medicalDeptSubDoctor.setDeptSubId(subId);
        medicalDeptSubDoctorDao.insert(medicalDeptSubDoctor);
    }
    @Override
    public HashMap selectById(int id) {
        // 从 doctorDao 获取结果，返回类型使用 Map 而不是原始 HashMap，确保类型安全
        HashMap result = doctorDao.selectById(id);
        // 检查 result 是否为 null 并且包含 "tag" 字段
        if (result != null && result.containsKey("tag")) {
            // 获取 "tag" 字段的值，假设其为字符串类型
            String tag = (String) result.get("tag");
            // 如果 tag 不为 null 且不为空
            if (tag != null && !tag.isEmpty()) {
                try {
                    // 将 tag 字符串解析为 JSONArray
                    JSONArray array = JSONUtil.parseArray(tag);
                    // 将解析后的 JSONArray 替换原来的 tag 字段值
                    result.put("tag", array);
                } catch (JSONException e) {
                    // 如果发生异常，记录日志
                    log.error("Error parsing tag JSON: ", e);
                }
            }
        }
        // 返回处理后的结果
        return result;
    }
    @Override
    public ArrayList<HashMap> selectDoctorBySubId(int subId) {
        return doctorDao.selectDoctorBySubId(subId);
    }
}
